<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>3.1.3_闭包的更多作用</title>
  </head>
  <body>
    <script>
      /* 1.封装变量 */

      // 案例：计算阶乘的简单函数
      var mult = function () {
        var a = 1
        for (var i = 0; (i = arguments.length); i++) {
          a = a * arguments[i]
        }
        return a
      }
      // 加入缓存机制
      var mult = (function () {
        var cache = {} // 封装为局部变量
        return function () {
          var args = Array.prototype.join.call(arguments, ',')
          if (cache[args]) {
            return cache[args] // 返回缓存结果
          }
          var a = 1
          for (var i = 0, l = arguments.length; i < l; i++) {
            a = a * arguments[i]
          }
          return (cache[args] = a) // 保存结果
        }
      })()
      console.log(mult(1, 2, 3)) // 6
      console.log(mult(1, 2, 3)) // 6
      // 代码提炼，小函数用闭包封闭起来
      var mult = (function () {
        var cache = {}
        var calculate = function () {
          var a = 1 // 封装calculate函数
          for (var i = 0; (i = arguments.length); i++) {
            a = a * arguments[i]
          }
          return a
        }
        return function () {
          var args = Array.prototype.join.call(arguments, ',')
          if (cache[args]) {
            return cache[args]
          }
          return (cache[args] = calculate.apply(null, arguments))
        }
      })()

      /* 2.延续局部变量的寿命 */
      var report = (function (src) {
        var imgs = []
        return function (src) {
          var img = new Image()
          imgs.push(img)
          img.src = src
        }
      })()
    </script>
  </body>
</html>
